home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 283_01 / fafnir.h < prev    next >
Text File  |  1988-12-08  |  20KB  |  572 lines

  1. /* fafnir.h -- general purpose forms dragon, with Elysian Fields
  2.                5/10/88, 8/20/88, 9/10/88, 9/24/88, by d.c.oshel
  3.                */
  4.  
  5. /*========================================================================* 
  6. **  A FORM_RULES array defines a form.                                    **
  7. **                                                                        **
  8. **  All relevant information about a form and its fields is collected in  **
  9. **  the field elements of a FORM_RULES array.                             **
  10.  *========================================================================*/
  11.  
  12. typedef char * FPTR; /* pointer to a character array used for data entry */
  13.  
  14. #define FIELDS FPTR  /* for convenience in declaring field names */
  15.  
  16. typedef int (cdecl * VALIDATER)(); /* pointer to C function returning int */
  17.  
  18. #define VNOP ((VALIDATER)0)     /* "null function", validate not required */
  19.  
  20. /* NOTE: character validaters:  unsigned (*cv)( unsigned ch, int position );
  21.          field validaters:      int (*fv)( char *p, int x, int y, int len );
  22.          field initializers:    int (*fi)( char *p, int x, int y, int len );
  23.          */
  24.  
  25. typedef struct field_element {
  26.     FPTR *fptr;   /* the ADDRESS of a char * to this field's storage area */
  27.     FPTR dflt;    /* pointer to a default data entry mask for this field */
  28.     int x;        /* screen column of field, 0..79 */
  29.     int y;        /* screen line of field, 0..24 */
  30.     int len;      /* field width; if negative, width of window & field = 80 */
  31.     VALIDATER fi; /* pointer to each-time-arrived field initializer */
  32.                   /* if fi == VNOP, the field is not touched */
  33.     VALIDATER cv; /* pointer to character-by-character validation function */
  34.                   /* if cv == VNOP, the cursor does not stop in the field */
  35.     VALIDATER fv; /* pointer to each-time-exited field validation function */
  36.                   /* if fv == VNOP, the field is considered valid */
  37.  
  38. } FORM_RULES;
  39.  
  40. /* see EditField concerning variable length fields (len < 0), below */
  41.  
  42.  
  43. /*======================================================================*/
  44. /*             FORM_RULES macros for standard field types               */
  45. /*======================================================================*/
  46.  
  47. #define MAXVFLDLEN 80     /* longest variable length field */
  48. #define SLIDE(L) (-L)     /* marks window width for variable length field */
  49.  
  50. #define DEFINE_FIELDS(Q) FORM_RULES Q[] = {
  51. #define END_FIELDS };
  52. #define GetPage(SCREEN,NAME,OFFSET,NUMFLZ) SCREEN,&NAME[OFFSET],NUMFLZ 
  53. #define FormSize(F) (sizeof(F)/sizeof(FORM_RULES))
  54.  
  55. /* default edit masks */
  56.  
  57. #define TX_MASK NULL      /* text */
  58. #define DL_MASK zdol      /* dollar */
  59. #define PH_MASK zfone     /* phone */
  60. #define DT_MASK zdate     /* date */
  61. #define SN_MASK zssn      /* social security number */
  62. #define ZR_MASK zeroes    /* all zeroes */
  63. #define YN_MASK "N"       /* Yes or No */
  64.  
  65. #define DL_SIZE 15
  66. #define PH_SIZE 14
  67. #define SN_SIZE 11
  68. #define TZ_SIZE 10
  69. #define DT_SIZE 8
  70. #define ZP_SIZE 5
  71. #define YN_SIZE 1
  72. #define TF_SIZE YN_SIZE
  73. #define ST_SIZE 2
  74. #define CO_SIZE 2
  75.  
  76. #define TOP_OF_FORM 0 
  77.  
  78. #define UPDATE 1   /* see Example, below */
  79. #define ADD 0      /* see Example, below */
  80.  
  81. /* the following macros reduce the field definition task to simple lists */
  82.  
  83. #define FIELD(F,M,X,Y,L,I,C,V)  {&F,M,X,Y,L,I,C,V},  /* generic macro */
  84.  
  85.             /*------------------------------------------*/
  86.             /*  F  field name                           */
  87.             /*  M  default field mask, i.e., contents   */
  88.             /*  X  screen column                        */
  89.             /*  Y  screen row                           */
  90.             /*  L  field length, i.e., width            */
  91.             /*  I  field initialization, VALIDATER name */
  92.             /*  C  character validation, VALIDATER name */
  93.             /*  V  field validation, VALIDATER name     */
  94.             /*------------------------------------------*/
  95.  
  96.             /*     Example of editing a prior record:
  97.             *
  98.             *      FIELDS lastname, firstnam, fullname, homephon;
  99.             *
  100.             *      DEFINE_FIELDS( edits_record )
  101.             *         TEXT(      lastname, 10, 2, 15               )
  102.             *         TEXT(      firstnam, 10, 3, 15               )
  103.             *         VIRTUAL(   fullname, 10, 5, 30, concatnames  )
  104.             *         PHONE_SET( homephon, "(319) 555-    ", 10, 7 )
  105.             *      END_FIELDS;
  106.             *
  107.             *      #define ALL 4
  108.             *
  109.             *      AllocateFields( edits_record, ALL );
  110.             *      <--find previous record and load fields because UPDATE-->
  111.             *      action = OnePageForm( 
  112.             *               GetPage( edits_record, TOPF, ALL_FIELDS ),
  113.             *               UPDATE
  114.             *               );
  115.             *      <--save/ignore edits, etc., based on action-->
  116.             *      ReleaseFields( edits_record, ALL );
  117.             */
  118.  
  119.             /* Note macro syntax: use "NAME( ", not "NAME ("
  120.             *  do not put trailing commas after ) in field type macros.
  121.             */
  122.  
  123.             /* WARNING: the NumFields dimension is ** CRITICAL **
  124.             *           in AllocateFields!  Potential system crash.
  125.             */
  126.  
  127.             /* WARNING: routines to load fields must pad right
  128.             *           with blanks, and honor field width!
  129.             */
  130.  
  131.  
  132. /* standard text field definitions */
  133.  
  134. #define TEXT(F,X,Y,L)         {&F,TX_MASK,X,Y,L,VNOP,cgood,VNOP},
  135. #define UPPER(F,X,Y,L)        {&F,TX_MASK,X,Y,L,VNOP,c2upr,VNOP},
  136.  
  137. #define TEXT_SET(F,M,X,Y,L)   {&F,M,X,Y,L,VNOP,cgood,VNOP},
  138. #define UPPER_SET(F,M,X,Y,L)  {&F,M,X,Y,L,VNOP,c2upr,VNOP},
  139.  
  140.  
  141. /* masked numeric input, L <= 10, R is a VALIDATER for range checking */
  142.  
  143. #define ZERO(F,X,Y,L,R)       {&F,ZR_MASK,X,Y,L,VNOP,cnmrc,R},
  144. #define ZERO_SET(F,M,X,Y,L,R) {&F,M,X,Y,L,VNOP,cnmrc,R},
  145.  
  146.  
  147. /* standard fields with pre-determined widths */
  148.  
  149. #define DOLLAR(F,X,Y)         {&F,DL_MASK,X,Y,DL_SIZE,lj_dol,cdoll,rj_dol},
  150. #define PHONE(F,X,Y)          {&F,PH_MASK,X,Y,PH_SIZE,VNOP,cfone,VNOP},
  151. #define SSN(F,X,Y)            {&F,SN_MASK,X,Y,SN_SIZE,VNOP,cnmrc,VNOP},
  152. #define DATE(F,X,Y)           {&F,DT_MASK,X,Y,DT_SIZE,VNOP,cnmrc,vdate},
  153. #define ZIP(F,X,Y)            {&F,ZP_MASK,X,Y,YN_SIZE,VNOP,cnmrc,VNOP},
  154. #define TENZIP(F,X,Y)         {&F,TZ_MASK,X,Y,TZ_SIZE,VNOP,cnzip,VNOP},
  155.  
  156. #define YESNO(F,X,Y)          {&F,"Y",X,Y,TF_SIZE,VNOP,ctfyn,vtrufal},
  157. #define NOYES(F,X,Y)          {&F,"N",X,Y,TF_SIZE,VNOP,ctfyn,vtrufal},
  158.  
  159. #define DOLLAR_SET(F,M,X,Y)   {&F,M,X,Y,DL_SIZE,lj_dol,cdoll,rj_dol},
  160. #define PHONE_SET(F,M,X,Y)    {&F,M,X,Y,PH_SIZE,VNOP,cfone,VNOP},
  161. #define SSN_SET(F,M,X,Y)      {&F,M,X,Y,SN_SIZE,VNOP,cnmrc,VNOP},
  162. #define DATE_SET(F,M,X,Y)     {&F,M,X,Y,DT_SIZE,VNOP,cnmrc,vdate},
  163. #define ZIP_SET(F,M,X,Y)      {&F,M,X,Y,YN_SIZE,VNOP,cnmrc,VNOP},
  164. #define TENZIP_SET(F,M,X,Y)   {&F,M,X,Y,TZ_SIZE,VNOP,cnzip,VNOP},
  165.  
  166.  
  167. /* standard two-letter U.S. state and territory abbreviations */
  168.  
  169. #define STATE_SET(F,M,X,Y)    {&F,M,X,Y,ST_SIZE,VNOP,c2upr,vstate},
  170.  
  171.  
  172. /* Iowa Dept. of Transportation numeric county codes */
  173.  
  174. #define COUNTY_SET(F,M,X,Y)   {&F,M,X,Y,CO_SIZE,VNOP,cnmrc,vcounty},
  175.  
  176.  
  177. /* information-only field types */
  178.  
  179. #define TODAY(F,X,Y)             {&F,NULL,X,Y,DT_SIZE,vtoday,VNOP,VNOP},
  180.  
  181. #define DISPLAY(F,X,Y,L)         {&F,NULL,X,Y,L,VNOP,VNOP,VNOP},
  182. #define VIRTUAL(F,X,Y,L,A)       {&F,NULL,X,Y,L,A,VNOP,VNOP}, /* (*fi)() does it! */
  183. #define COMPUTE(F,X,Y,L,B)       {&F,NULL,X,Y,L,VNOP,VNOP,B}, /* (*fv)() does it! */
  184.  
  185. #define DISPLAY_SET(F,M,X,Y,L)   {&F,M,X,Y,L,VNOP,VNOP,VNOP},
  186. #define VIRTUAL_SET(F,M,X,Y,L,A) {&F,M,X,Y,L,A,VNOP,VNOP}, /* (*fi)() does it! */
  187. #define COMPUTE_SET(F,M,X,Y,L,B) {&F,M,X,Y,L,VNOP,VNOP,B}, /* (*fv)() does it! */
  188.  
  189.  
  190. /* INITIALIZE is a dummy (and costly!) secondary reference to a field.
  191.  
  192.    The idea is to get a field which is not immediately used into the range 
  193.    of fields allocated and/or initialized by AllocateFields or In